package com.feri.fitness.us.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.feri.fitness.common.config.RocketMQConfig;
import com.feri.fitness.common.config.SystemConfig;
import com.feri.fitness.common.dto.MqLevelMsg;
import com.feri.fitness.common.dto.PayAddDto;
import com.feri.fitness.common.dto.PlusOrderAddDto;
import com.feri.fitness.common.vo.R;
import com.feri.fitness.us.dao.PlusOrderDao;
import com.feri.fitness.us.dao.UserLevelDao;
import com.feri.fitness.us.dao.UserMessageDao;
import com.feri.fitness.us.dao.UserWalletDao;
import com.feri.fitness.us.domain.PlusOrder;
import com.feri.fitness.us.domain.UserLevel;
import com.feri.fitness.us.domain.UserMessage;
import com.feri.fitness.us.domain.UserWallet;
import com.feri.fitness.us.exception.PlusOrderException;
import com.feri.fitness.us.feign.PayService;
import com.feri.fitness.us.service.intf.PlusOrderService;
import com.feri.fitness.us.service.intf.UserPlusService;
import com.feri.fitness.us.type.MessageType;
import com.feri.fitness.us.util.RocketMqUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;

/**
 * ━━━━━━神兽出没━━━━━━
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　 ┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　  ┃
 * 　　┃　　　　　　 ┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛Code is far away from bug with the animal protecting
 * 　　　　┃　　　┃    神兽保佑,代码无bug
 * 　　　　┃　　　┃
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━永无BUG!━━━━━━
 *
 * @Description:
 * @Author: 邢朋辉
 * @Date: 2023/1/10 09:44
 */
@Service
public class PlusOrderServiceImpl implements PlusOrderService {
    @Resource
    private PlusOrderDao dao;
    @Resource
    private UserPlusService plusService;
    @Resource
    private PayService payService;
    @Resource
    private UserWalletDao walletDao;

    @Override
    @Transactional
    public R createOrder(PlusOrderAddDto dto, int uid) throws PlusOrderException {
        //1.验证
        if(dto!=null){
            //2.生成订单信息
            PlusOrder order=new PlusOrder();
            BeanUtils.copyProperties(dto,order);
            order.init();
            order.setUid(uid);
            order.setNo("plus-"+System.currentTimeMillis()+"-"+uid);
            //3.操作数据库
            if(dao.insert(order)>0){
                //4.调用支付 获取支付二维码
                R r=payService.create(new PayAddDto(order.getNo(),"Plus会员"+order.getType()+"套餐"
                ,order.getPaymoney(),1));
                if(r.getCode()==1){
                    //触发 事务的回滚机制
                    throw new PlusOrderException("亲，充值会员异常！");
                }
                return r;
            }
        }
        return R.fail();
    }

    @Transactional
    @Override
    public R updateSuccess(String no) {
        //1.验证
        if(StringUtils.hasLength(no)){
            //2.查询
            PlusOrder order=dao.selectOne(new QueryWrapper<PlusOrder>().eq("no",no));
            if(order!=null){
                //3.更新订单的状态
                order.setFlag(2);
                if(dao.updateById(order)>0){

                    //4.操作用户plus 进行续费或开通
                    if(order.getPlustype()==1){
                        //5.开通
                        plusService.add(order.getUid(),order.getType());
                        //开通会员-给予奖励
                        //6.奖励红包（只有开通1个月以上才有,支付金额的一半）
                        if(order.getType()>2) {
                            walletDao.updateRed(order.getPaymoney() / 2, order.getUid());
                        }
                    }else {
                        //7.续费
                        plusService.update(order.getUid(),order.getType());
                    }
                   //发送MQ 消息
                    RocketMqUtil.send(RocketMQConfig.MQ_GROW, JSON.toJSONString(
                            new MqLevelMsg(order.getUid(),(int)(order.getMoney()*10),
                                    "恭喜你，plus会员充值成功！")));
                    return R.ok();
                }
            }
        }
        return R.fail();
    }

}
